﻿// clases de la FCL
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// controles
using PDS_ANDU.Controles;
// clases auxiliares
using PDS_ANDU.DTO;

namespace PDS_ANDU.GUI
{
    public partial class SuscriptorAgregarPerfil : Form
    {
        // usuario logueado
        string cuenta;
        // Mantiene las categorias obtenidas
        private DTOCategoria[] deportes;
        private DTOCategoria[] torneos;
        private DTOCategoria[] equipos;
        private DTOCategoria[] deportistas;

        public SuscriptorAgregarPerfil(string cuenta)
        {
            InitializeComponent();
            // asigna el atributo
            this.cuenta = cuenta;
        }

        private void SuscriptorAgregarPerfil_Load(object sender, EventArgs e)
        {
            // ubica la ventana centrada respecto al MdiParent
            this.Location = new Point(this.MdiParent.ClientSize.Width / 2 - this.Width / 2, this.MdiParent.ClientSize.Height / 2 - this.Height / 2);
            // solicita las categorias de inicio
            this.cargarCategorias();
        }

        /// <summary>
        /// Carga los valores disponibles para deportes,
        /// torneos, equipos y deportistas en las checkboxList.
        /// </summary>
        private void cargarCategorias()
        {
            // carga los deportes
            cargarDeportes();
            // carga los torneos
            cargarTorneos();
            // carga los equipos
            cargarEquipos();
            //carga los deportistas
            cargarDeportistas();
        } // fin del método cargarCategorias

        /// <summary>
        /// Carga los valores disponibles para deportes.
        /// </summary>
        private void cargarDeportes()
        {
            // crea una instancia de control y le solicita la lista de Deportes
            ControlPerfil control = new ControlPerfil();
            DTOCategoria[] deportes = control.obtenerDeportes();
            // almacena los deportes en el atributo de clase
            this.deportes = deportes;
            // obtiene todos los nombres de deportes
            string[] opciones = new string[deportes.Length];
            
            for (int i = 0; i < deportes.Length; i++)
            {
                // agrega la cadena
                opciones[i] = deportes[i].Nombre;
            }
            checkedListBox1.Items.AddRange(opciones);
        } // fin del método cargarDeportes

        /// <summary>
        /// Carga los valores disponibles para torneos
        /// </summary>
        private void cargarTorneos()
        {
            // crea una instancia de control y le solicita la lista de Torneos
            ControlPerfil control = new ControlPerfil();
            DTOCategoria[] torneos = control.obtenerTorneos();
            // almacena los torneos en el atributo de clase
            this.torneos = torneos;
            // obtiene todos los nombres de deportes
            string[] opciones = new string[torneos.Length];

            for (int i = 0; i < torneos.Length; i++)
            {
                // agrega la cadena
                opciones[i] = torneos[i].Nombre;
            }
            checkedListBox2.Items.AddRange(opciones);
        } // fin del método cargarTorneos

        /// <summary>
        /// Carga los valores disponibles para equipos.
        /// </summary>
        private void cargarEquipos()
        {
            // crea una instancia de control y le solicita la lista de Deportes
            ControlPerfil control = new ControlPerfil();
            DTOCategoria[] equipos = control.obtenerEquipos();
            // almacena los equipos en el atributo de clase
            this.equipos = equipos;
            // obtiene todos los nombres de deportes
            string[] opciones = new string[equipos.Length];

            for (int i = 0; i < equipos.Length; i++)
            {
                // agrega la cadena
                opciones[i] = equipos[i].Nombre;
            }
            checkedListBox3.Items.AddRange(opciones);
        } // fin del método cargarEquipos

        /// <summary>
        /// Carga los valores disponibles para deportistas.
        /// </summary>
        private void cargarDeportistas()
        {
            // crea una instancia de control y le solicita la lista de Deportes
            ControlPerfil control = new ControlPerfil();
            DTOCategoria[] deportistas = control.obtenerDeportistas();
            // almacena los deportistas en el atributo de clase
            this.deportistas = deportistas;
            // obtiene todos los nombres de deportes
            string[] opciones = new string[deportistas.Length];

            for (int i = 0; i < deportistas.Length; i++)
            {
                // agrega la cadena
                opciones[i] = deportistas[i].Nombre;
            }
            checkedListBox4.Items.AddRange(opciones);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // verifica que haya introducido un nombre de perfil
            string nombrePerfil = textBox1.Text;
            // crea una instancia de control
            ControlPerfil control = new ControlPerfil();

            // si el nombre de perfil está vacío y el usuario no creó
            // anteriormente un perfil con el mismo nombre
            if (nombrePerfil != "" && !control.existePerfil(cuenta, nombrePerfil))
            {
                // verifica que se haya seleccionado al menos un deporte
                int numDeportes = checkedListBox1.CheckedItems.Count;

                // si seleccionó al menos un deporte
                if (numDeportes > 0)
                {
                    // obtiene la lista de categorias seleccionadas
                    DTOCategoria[] deportes = obtenerDeportes();
                    DTOCategoria[] torneos = obtenerTorneos();
                    DTOCategoria[] equipos = obtenerEquipos();
                    DTOCategoria[] deportistas = obtenerDeportistas();

                    try
                    {
                        // solicita creación de perfil
                        control.crearPerfil(cuenta, nombrePerfil, deportes, torneos, equipos, deportistas);
                        // informa la creación de perfil
                        MessageBox.Show("Felicitaciones! el perfil se creó correctamente", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        // crea la instancia de ventana
                        Suscriptor ventana = new Suscriptor(cuenta);
                        // asigna el MdiParent
                        ventana.MdiParent = this.MdiParent;
                        // abra la ventana nueva
                        ventana.Show();
                        // cierra la ventana actual
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Ha ocurrido un error. Detalles: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        // crea la instancia de ventana
                        Suscriptor ventana = new Suscriptor(cuenta);
                        // asigna el MdiParent
                        ventana.MdiParent = this.MdiParent;
                        // abra la ventana nueva
                        ventana.Show();
                        // cierra la ventana actual
                        this.Close();
                    }
                }
                else
                {
                    MessageBox.Show("Por favor, seleccione al menos un deporte.", "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            else
            {
                if (nombrePerfil == "")
                {
                    MessageBox.Show("Por favor, introduzca un nombre de perfil.", "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                else
                {
                    MessageBox.Show("Ya existe un perfil con el mismo nombre. Por favor, introduzca un nombre de perfil diferente.", "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        } // fin del método cargarDeportistas

        private DTOCategoria[] obtenerDeportes()
        {
            int numDeportes = checkedListBox1.CheckedItems.Count;
            // obtiene los deportes seleccionados de cada categoria
            DTOCategoria[] deportes = new DTOCategoria[numDeportes];
            CheckedListBox.CheckedIndexCollection dep = checkedListBox1.CheckedIndices;

            for (int i = 0; i < numDeportes; i++)
            {
                deportes[i] = this.deportes.ElementAt(Int32.Parse(dep[i].ToString()));
            }

            return deportes;
        }

        private DTOCategoria[] obtenerTorneos()
        {
            int numTorneos = checkedListBox2.CheckedItems.Count;
            // obtiene los torneos seleccionados de cada categoria
            DTOCategoria[] torneos = new DTOCategoria[numTorneos];
            CheckedListBox.CheckedIndexCollection t = checkedListBox2.CheckedIndices;

            for (int i = 0; i < numTorneos; i++)
            {
                torneos[i] = this.torneos.ElementAt(Int32.Parse(t[i].ToString()));
            }

            return torneos;
        }

        private DTOCategoria[] obtenerEquipos()
        {
            int numEquipos = checkedListBox3.CheckedItems.Count;
            // obtiene los equipos seleccionados de cada categoria
            DTOCategoria[] equipos = new DTOCategoria[numEquipos];
            CheckedListBox.CheckedIndexCollection equip = checkedListBox3.CheckedIndices;

            for (int i = 0; i < numEquipos; i++)
            {
                equipos[i] = this.equipos.ElementAt(Int32.Parse(equip[i].ToString()));
            }

            return equipos;
        }

        private DTOCategoria[] obtenerDeportistas()
        {
            int numDeportistas = checkedListBox4.CheckedItems.Count;
            // obtiene los deportistas seleccionados de cada categoria
            DTOCategoria[] deportistas = new DTOCategoria[numDeportistas];
            CheckedListBox.CheckedIndexCollection dep = checkedListBox4.CheckedIndices;

            for (int i = 0; i < numDeportistas; i++)
            {
                deportistas[i] = this.deportistas.ElementAt(Int32.Parse(dep[i].ToString()));
            }

            return deportistas;
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// Manejador de evento "Click en botón cancelar"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            // crea la instancia de ventana
            Suscriptor ventana = new Suscriptor(cuenta);
            // asigna el MdiParent
            ventana.MdiParent = this.MdiParent;
            // abra la ventana nueva
            ventana.Show();
            // cierra la ventana actual
            this.Close();
        }

        private void verToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // crea la instancia de ventana
            SuscriptorPerfiles ventana = new SuscriptorPerfiles(cuenta);
            // asigna el MdiParent
            ventana.MdiParent = this.MdiParent;
            // abra la ventana nueva
            ventana.Show();
            // cierra la ventana actual
            this.Close();
        } // fin del manejador de evento
    }
}
